import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'
import { PrismaClient } from '@prisma/client'

/**
 * 数据库服务类
 * 负责管理 Prisma 客户端的生命周期
 */
@Injectable()
export class DatabaseService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
  constructor() {
    super({
      log: ['query', 'info', 'warn', 'error'],
      errorFormat: 'pretty'
    })
  }

  /**
   * 模块初始化时连接数据库
   */
  async onModuleInit() {
    try {
      await this.$connect()
      console.log('✅ 数据库连接成功')
    } catch (error) {
      console.error('❌ 数据库连接失败:', error)
      throw error
    }
  }

  /**
   * 模块销毁时断开数据库连接
   */
  async onModuleDestroy() {
    try {
      await this.$disconnect()
      console.log('✅ 数据库连接已断开')
    } catch (error) {
      console.error('❌ 数据库断开连接失败:', error)
    }
  }

  /**
   * 清理数据库连接
   */
  async enableShutdownHooks(app: any) {
    process.on('beforeExit', async () => {
      await app.close()
    })
  }

  /**
   * 健康检查
   */
  async healthCheck(): Promise<boolean> {
    try {
      await this.$queryRaw`SELECT 1`
      return true
    } catch (error) {
      console.error('数据库健康检查失败:', error)
      return false
    }
  }
}
